button: Ensure the button is "left" when a gesture is cancelled
authorCarlos Garnacho <carlosg@gnome.org>
Wed, 25 Feb 2015 19:29:22 +0000 (20:29 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Mon, 2 Mar 2015 11:01:07 +0000 (12:01 +0100)
This prevents from stale widget states if the gesture happens to be
cancelled mid-press.

gtk/gtkbutton.c

index 9e0ca78ed1f1401814dd329e251c2fd257ecddfa..bb90dafe3d0089446e6f049ebeed146e1507f9ec 100644 (file)
@@ -147,6 +147,8 @@ static void gtk_button_state_changed   (GtkWidget             *widget,
                                        GtkStateType           previous_state);
 static void gtk_button_grab_notify     (GtkWidget             *widget,
                                        gboolean               was_grabbed);
+static void gtk_button_do_release      (GtkButton             *button,
+                                        gboolean               emit_clicked);
 
 static void gtk_button_actionable_iface_init     (GtkActionableInterface *iface);
 static void gtk_button_activatable_interface_init(GtkActivatableIface  *iface);
@@ -644,6 +646,14 @@ multipress_gesture_update_cb (GtkGesture       *gesture,
     }
 }
 
+static void
+multipress_gesture_cancel_cb (GtkGesture       *gesture,
+                              GdkEventSequence *sequence,
+                              GtkButton        *button)
+{
+  gtk_button_do_release (button, FALSE);
+}
+
 static void
 gtk_button_init (GtkButton *button)
 {
@@ -683,6 +693,7 @@ gtk_button_init (GtkButton *button)
   g_signal_connect (priv->gesture, "pressed", G_CALLBACK (multipress_pressed_cb), button);
   g_signal_connect (priv->gesture, "released", G_CALLBACK (multipress_released_cb), button);
   g_signal_connect (priv->gesture, "update", G_CALLBACK (multipress_gesture_update_cb), button);
+  g_signal_connect (priv->gesture, "cancel", G_CALLBACK (multipress_gesture_cancel_cb), button);
   gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->gesture), GTK_PHASE_BUBBLE);
 }